package com.azh.server.datam.page;

import java.util.Arrays;

import com.azh.server.datam.pagecache.PageCache;
import com.azh.server.util.RandomUtils;

/**
 * @author zhaozhenhang <zhaozhenhang@kuaishou.com>
 * Created on 2022-04-25
 * 这是AeroDB的第一页，用来做数据校验高可用的（启动检查），在启动时生成一些随机字节（10-20），然后第一页存储这些随机字节，在数据库正常关闭时
 * 会把这些字节拷贝到第一页上面（20-30），以此判断两个字节是否相等判断数据是否丢失，如果不等就得通过我们的redo log 恢复字节，
 */
public class PageMeta {

    private static final int of_vc = 100;
    private static final int len_vc = 8;

    public static byte[] initRaw() {
        byte[] raw = new byte[PageCache.PAGE_SIZE];
        setVcOpen(raw);
        return raw;
    }

    /**
     * 启动时设置初始字节
     * @param page
     */
    public static void setVcOpen(Page page) {
        page.setDirty(true);
        setVcOpen(page.getData());
    }

    /**
     * 关闭时拷贝字节
     * @param page
     */
    public static void setVcClose(Page page) {
        page.setDirty(true);
        setVcClose(page.getData());
    }

    /**
     * 校验字节
     * @param page
     * @return
     */
    public static boolean checkVc(Page page) {
        return checkVc(page.getData());
    }

    private static boolean checkVc(byte[] row) {
        return Arrays.equals(Arrays.copyOfRange(row, of_vc, of_vc + len_vc),
                Arrays.copyOfRange(row, of_vc + len_vc, of_vc + len_vc * 2));
    }
    private static void setVcOpen(byte[] row) {
        System.arraycopy(RandomUtils.randomBytes(len_vc), 0, row, of_vc, len_vc);
    }

    private static void setVcClose(byte[] row) {
        System.arraycopy(row, of_vc, row, of_vc + len_vc, len_vc);
    }
}
